package acl

import (
	"gitlab.local/golibrary/user"
	"os"
	"os/exec"
	"strconv"
	"syscall"
)

func IsWrite(path, uname string) bool {
	// 获取用户信息
	u, err := user.Lookup(uname)
	if err != nil {
		return false
	}

	// 解析用户的 UID 和 GID
	uid, err := strconv.Atoi(u.Uid)
	if err != nil {
		return false
	}

	gid, err := strconv.Atoi(u.Gid)
	if err != nil {
		return false
	}

	// 创建一个新的命令，执行 test 命令
	cmd := exec.Command("test", "-w", path)

	// 设置子进程的 UID 和 GID
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Credential: &syscall.Credential{
			Uid: uint32(uid), // 切换到的用户的 UID
			Gid: uint32(gid), // 切换到的用户的 GID
		},
	}

	// 将子进程的标准输入、输出和错误输出连接到当前进程的标准输入、输出和错误输出
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	// 启动命令并等待其完成
	err = cmd.Run()
	if err != nil {
		return false
	}

	return true
}

func IsRead(path, uname string) bool {
	// 获取用户信息
	u, err := user.Lookup(uname)
	if err != nil {
		return false
	}

	// 解析用户的 UID 和 GID
	uid, err := strconv.Atoi(u.Uid)
	if err != nil {
		return false
	}

	gid, err := strconv.Atoi(u.Gid)
	if err != nil {
		return false
	}

	// 创建一个新的命令，执行 test 命令
	cmd := exec.Command("test", "-r", path)

	// 设置子进程的 UID 和 GID
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Credential: &syscall.Credential{
			Uid: uint32(uid), // 切换到的用户的 UID
			Gid: uint32(gid), // 切换到的用户的 GID
		},
	}

	// 将子进程的标准输入、输出和错误输出连接到当前进程的标准输入、输出和错误输出
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	// 启动命令并等待其完成
	err = cmd.Run()
	if err != nil {
		return false
	}

	return true
}
